﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc;
using Entidades.Seguridad;
using System.Runtime.Remoting.Contexts;
using System.Security.Principal;
using Entidades.Sistema.Base;
using Entidades.Sistema.Venta;
using Modelo.Sistema.Base;
using Modelo.Sistema.Venta;
using Modelo.Seguridad;
using DevExpress.Web.Mvc;
using Modelo.Seguridad;
using System.Web.Security;
using VistaOnlineR1._1.Models;
using VistaOnlineR1._1.Controllers.Seguridad;

namespace VistaOnlineR1._1.Controllers.Sistema.Base
{
    public class EmpleadoController : BaseController
    {

        #region campos
        CatalogoEmpleado _catalogoEmpleado;
        CatalogoCargo  _catalogoCargo;
        CatalogoUsuarios  _catalogoUsuarios;
        CatalogoGrupos  _catalogoGrupos;
        #endregion

        #region Constructors
        public EmpleadoController()
            : this(new CatalogoEmpleado(), new CatalogoCargo(), new CatalogoUsuarios(), new CatalogoGrupos())
        {
        }

        public EmpleadoController(CatalogoEmpleado catalogoEmpleado, CatalogoCargo catalogoCargo, CatalogoUsuarios catalogoUsuarios, CatalogoGrupos catalogoGrupos)
        {
            _catalogoEmpleado = catalogoEmpleado;
            _catalogoCargo = catalogoCargo;
            _catalogoUsuarios = catalogoUsuarios;
            _catalogoGrupos = catalogoGrupos;
        }
        #endregion

        public ActionResult Index()
        {
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Estado = Enum.GetValues(typeof(PedidosEstado));

            ViewBag.Cargo = _catalogoCargo.ListarCargo();

            return View(_catalogoEmpleado.Listarempleados());
        }

        [ValidateInput(false)]
        public ActionResult EditEmpleadosPartial()
        {
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");
            ViewBag.Cargo = _catalogoCargo.ListarCargo();
            return PartialView("EditEmpleadosPartial", _catalogoEmpleado.Listarempleados());
        }


        [HttpPost, ValidateInput(false)]
        public ActionResult EditEmpleadosUpdatePartial([ModelBinder(typeof(DevExpressEditorsBinder))] Empleado empleado)
        {
            ModelState.Clear();
            ViewBag.Cargo = _catalogoCargo.ListarCargo();
            empleado.id_Usuario = empleado.IdUsuario;

            Empleado oemplead2 = new Empleado();

            oemplead2 =  _catalogoEmpleado.BuscarEmpleadoPornumero(empleado.IdUsuario);

            empleado.Clave = oemplead2.Clave;

           
            //REVISAR - No carga en el popup el valor de la clave.
            if (ModelState.IsValid)
            {
                try
                {
                    _catalogoEmpleado.ModificarEmpleado(empleado);
                }
                catch (Exception e)
                {
                    ViewData["EditError"] = e.Message;
                }
            }
            else
                ViewData["EditError"] = "Por Favor, modifica los errores.";

            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Cargo = _catalogoCargo.ListarCargo();

            return PartialView("EditEmpleadosPartial", _catalogoEmpleado.Listarempleados());

        }

        public ActionResult EditEmpleadosDeletePartial(string IdEmpleado)
        {

            _catalogoEmpleado.EliminarEmpleado(_catalogoEmpleado.BuscarEmpleadoPornumero(IdEmpleado));
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");           

            ViewBag.Cargo = _catalogoCargo.ListarCargo();

            return PartialView("EditEmpleadosPartial", _catalogoEmpleado.Listarempleados());
        }


        [HttpPost, ValidateInput(false)]
        public ActionResult EditEmpleadosAddNewPartial(Empleado empleado)
        {
            ModelState.Clear();
            empleado.IdEmpleado = 0;
            NewPassword NewPassword = new NewPassword();
            string nuevaPass = NewPassword.GenerarPass(3, 10);
            empleado.id_Usuario = empleado.IdUsuario;
            empleado.Clave = nuevaPass;

            if (ModelState.IsValid)
            {
                try
                {
                     empleado.Clave = Encriptar(empleado.Clave);
                    _catalogoEmpleado.AgregarEmpleado(empleado);
                    SendEmailEmpleado(empleado, nuevaPass);
                }
                catch (Exception e)
                {
                    ViewData["EditError"] = e.Message;
                }
            }
            else
                ViewData["EditError"] = "Por Favor, modifica los errores.";

            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");
            ViewBag.Cargo = _catalogoCargo.ListarCargo();
            return PartialView("EditEmpleadosPartial", _catalogoEmpleado.Listarempleados());
        }


        private string Encriptar(string valor)
        {
            System.Security.Cryptography.SHA1CryptoServiceProvider provider = new System.Security.Cryptography.SHA1CryptoServiceProvider();
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(valor);
            byte[] inArray = provider.ComputeHash(bytes);
            provider.Clear();
            return Convert.ToBase64String(inArray);
        }


        public static void SendEmailEmpleado(Empleado empleado, string nuevaPass)
        {

            try
            {

                MailAddress fromAddress = new MailAddress("trabajodediploma2012@gmail.com", "From Name");
                MailAddress toAddress = new MailAddress(empleado.Email, "To Name");
                const string subject = "Su Password";
                string body = "<p>Usuario:" + empleado.IdUsuario + " su password es: " + nuevaPass + "</p>";
                body += "<p>Acceda al sistema para modificarla.</p>";

                MailMessage msg = new MailMessage(fromAddress.Address, toAddress.Address, subject, body);
                msg.IsBodyHtml = true;

                var client = new SmtpClient("smtp.gmail.com", 587)
                {
                    Credentials = new NetworkCredential("trabajodediploma2012@gmail.com", "diploma2012"),
                    EnableSsl = true
                };

                client.Send(msg);

            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }

    }
}
